package com.ls.httpstudy.http.configuration;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestTemplate;

import java.nio.charset.Charset;
import java.util.List;

/**
 * 通过SpringBoot-RestTemplate
 * springBoot-RestTemple是上面三种方式的集大成者，代码编写更加简单，目前可以采用的调用第三方接口有：
 *
 * delete() 在特定的URL上对资源执行HTTP DELETE操作
 * #exchange() 在URL上执行特定的HTTP方法，返回包含对象的ResponseEntity，这个对象是从响应体中映射得到的
 * execute() 在URL上执行特定的HTTP方法，返回一个从响应体映射得到的对象
 * #getForEntity() 发送一个HTTP GET请求，返回的ResponseEntity包含了响应体所映射成的对象
 * #getForObject() 发送一个HTTP GET请求，返回的请求体将映射为一个对象
 * #postForEntity() POST 数据到一个URL，返回包含一个对象的ResponseEntity，这个对象是从响应体中映射得到的
 * #postForObject() POST 数据到一个URL，返回根据响应体匹配形成的对象
 * headForHeaders() 发送HTTP HEAD请求，返回包含特定资源URL的HTTP头
 * optionsForAllow() 发送HTTP OPTIONS请求，返回对特定URL的Allow头信息
 * postForLocation() POST 数据到一个URL，返回新创建资源的URL
 * put() PUT 资源到特定的URL
 *
 * #为常用方法
 */
@Configuration
public class RestTemplateConfig {
    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory factory){
        RestTemplate restTemplate = new RestTemplate(factory);
        List<HttpMessageConverter<?>> list = restTemplate.getMessageConverters();
        for (HttpMessageConverter<?> httpMessageConverter : list) {
            if(httpMessageConverter instanceof StringHttpMessageConverter) {
                ((StringHttpMessageConverter) httpMessageConverter).setDefaultCharset(Charset.forName("UTF-8"));
                break;
            }
        }
        return restTemplate;
    }

    @Bean
    public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        factory.setConnectTimeout(15000);
        factory.setReadTimeout(5000);
        return factory;
    }

}
